

<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  
  <title>OSD 故障排除 &mdash; Ceph Documentation</title>
  

  
  <link rel="stylesheet" href="../../../_static/ceph.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/graphviz.css" type="text/css" />
  <link rel="stylesheet" href="../../../_static/css/custom.css" type="text/css" />

  
  
    <link rel="shortcut icon" href="../../../_static/favicon.ico"/>
  

  
  

  

  
  <!--[if lt IE 9]>
    <script src="../../../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
    
      <script type="text/javascript" id="documentation_options" data-url_root="../../../" src="../../../_static/documentation_options.js"></script>
        <script src="../../../_static/jquery.js"></script>
        <script src="../../../_static/underscore.js"></script>
        <script src="../../../_static/doctools.js"></script>
    
    <script type="text/javascript" src="../../../_static/js/theme.js"></script>

    
    <link rel="index" title="Index" href="../../../genindex/" />
    <link rel="search" title="Search" href="../../../search/" />
    <link rel="next" title="归置组排障" href="../troubleshooting-pg/" />
    <link rel="prev" title="监视器故障排除" href="../troubleshooting-mon/" /> 
</head>

<body class="wy-body-for-nav">

   
  <header class="top-bar">
    

















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="wy-breadcrumbs">
    
      <li><a href="../../../" class="icon icon-home"></a> &raquo;</li>
        
          <li><a href="../../">Ceph 存储集群</a> &raquo;</li>
        
          <li><a href="../../operations/">集群运维</a> &raquo;</li>
        
      <li>OSD 故障排除</li>
    
    
      <li class="wy-breadcrumbs-aside">
        
          
            <a href="../../../_sources/rados/troubleshooting/troubleshooting-osd.rst.txt" rel="nofollow"> View page source</a>
          
        
      </li>
    
  </ul>

  
  <hr/>
</div>
  </header>
  <div class="wy-grid-for-nav">
    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #eee" >
          

          
            <a href="../../../">
          

          
            
            <img src="../../../_static/logo.png" class="logo" alt="Logo"/>
          
          </a>

          

          
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../../../search/" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

          
        </div>

        
        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          
            
            
              
            
            
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../../start/intro/">Ceph 简介</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../install/">安装 Ceph</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../cephadm/">Cephadm</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../">Ceph 存储集群</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../../configuration/">配置</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../operations/">运维</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../man/">    手册页</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="../">故障排除</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="../community/">Ceph 社区</a></li>
<li class="toctree-l3"><a class="reference internal" href="../log-and-debug/">日志记录和调试</a></li>
<li class="toctree-l3"><a class="reference internal" href="../troubleshooting-mon/">监视器故障排除</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">OSD 故障排除</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#id2">收集 OSD 数据</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id6">停止自动重均衡</a></li>
<li class="toctree-l4"><a class="reference internal" href="#osd-not-running">OSD 没运行</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id11">OSD 龟速或无响应</a></li>
<li class="toctree-l4"><a class="reference internal" href="#id24">状态抖动的 OSD</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="../troubleshooting-pg/">归置组排障</a></li>
<li class="toctree-l3"><a class="reference internal" href="../memory-profiling/">内存剖析</a></li>
<li class="toctree-l3"><a class="reference internal" href="../cpu-profiling/">CPU 剖析</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../../api/">APIs</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../../cephfs/">Ceph 文件系统</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../rbd/">Ceph 块设备</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../radosgw/">Ceph 对象网关</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mgr/">Ceph 管理器守护进程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../mgr/dashboard/">Ceph 仪表盘</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../api/">API 文档</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../architecture/">体系结构</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dev/developer_guide/">开发者指南</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../dev/internals/">Ceph 内幕</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../governance/">项目管理</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../foundation/">Ceph 基金会</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../ceph-volume/">ceph-volume</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../releases/general/">Ceph 版本（总目录）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../releases/">Ceph 版本（索引）</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../security/">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../glossary/">Ceph 术语</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../jaegertracing/">Tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../translation_cn/">中文版翻译资源</a></li>
</ul>

            
          
        </div>
        
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" aria-label="top navigation">
        
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../../../">Ceph</a>
        
      </nav>


      <div class="wy-nav-content">
        
        <div class="rst-content">
        
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
            
<div id="dev-warning" class="admonition note">
  <p class="first admonition-title">Notice</p>
  <p class="last">This document is for a development version of Ceph.</p>
</div>
  <div id="docubetter" align="right" style="padding: 5px; font-weight: bold;">
    <a href="https://pad.ceph.com/p/Report_Documentation_Bugs">Report a Documentation Bug</a>
  </div>

  
  <div class="section" id="osd">
<h1>OSD 故障排除<a class="headerlink" href="#osd" title="Permalink to this headline">¶</a></h1>
<p>对 OSD 排障前，先检查一下各监视器和网络。
如果命令行 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">health</span></code> 或 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">-s</span></code> 返回的是 <code class="docutils literal notranslate"><span class="pre">HEALTH_OK</span></code> ，
这意味着监视器们形成了法定人数。
如果你还没监视器法定人数、或者监视器状态有错误，
要<a class="reference external" href="../troubleshooting-mon">先定位监视器问题</a>。
核实下你的网络，确保它在正常运行，
因为网络对 OSD 的正常运作和性能有显著影响，
检查一下主机侧的丢包情况和交换机侧的 CRC 错误。</p>
<div class="section" id="id2">
<h2>收集 OSD 数据<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
<p>开始 OSD 排障的第一步最好先收集拓扑信息，
另外还有<a class="reference external" href="../../operations/monitoring-osd-pg">监控 OSD</a> 时收集的，如 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">osd</span> <span class="pre">tree</span></code> 。</p>
<div class="section" id="ceph">
<h3>Ceph 日志<a class="headerlink" href="#ceph" title="Permalink to this headline">¶</a></h3>
<p>如果你没改默认路径，可以在 <code class="docutils literal notranslate"><span class="pre">/var/log/ceph</span></code> 下找到日志：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ls</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">log</span><span class="o">/</span><span class="n">ceph</span>
</pre></div>
</div>
<p>如果看到的日志还不够详细，可以增大日志级别。请参考<a class="reference external" href="../log-and-debug">日志记录和调试</a>，
看看如何保证看到大量日志时又不影响集群运行。</p>
</div>
<div class="section" id="id3">
<h3>管理套接字<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h3>
<p>用管理套接字检索运行时信息。要看详细信息，罗列一下
Ceph 守护进程的套接字：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ls</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">run</span><span class="o">/</span><span class="n">ceph</span>
</pre></div>
</div>
<p>然后，执行下例命令显示可用选项，把 <code class="docutils literal notranslate"><span class="pre">{daemon-name}</span></code> 换成实际的守护进程（如 <code class="docutils literal notranslate"><span class="pre">osd.0</span></code> ）：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">daemon</span> <span class="n">osd</span><span class="mf">.0</span> <span class="n">help</span>
</pre></div>
</div>
<p>另外，你也可以指定一个 <code class="docutils literal notranslate"><span class="pre">{socket-file}</span></code> （如 <code class="docutils literal notranslate"><span class="pre">/var/run/ceph</span></code> 下的文件）：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">daemon</span> <span class="p">{</span><span class="n">socket</span><span class="o">-</span><span class="n">file</span><span class="p">}</span> <span class="n">help</span>
</pre></div>
</div>
<p>和其它手段相比，管理接口允许你：</p>
<ul class="simple">
<li><p>在运行时列出配置</p></li>
<li><p>列出历史操作</p></li>
<li><p>列出操作的优先队列状态</p></li>
<li><p>列出在进行的操作</p></li>
<li><p>列出性能计数器</p></li>
</ul>
</div>
<div class="section" id="id4">
<h3>显示剩余空间<a class="headerlink" href="#id4" title="Permalink to this headline">¶</a></h3>
<p>可能是文件系统问题，用 <code class="docutils literal notranslate"><span class="pre">df</span></code> 显示文件系统剩余空间。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">df</span> <span class="o">-</span><span class="n">h</span>
</pre></div>
</div>
<p>其它用法见 <code class="docutils literal notranslate"><span class="pre">df</span> <span class="pre">--help</span></code> 。</p>
</div>
<div class="section" id="i-o">
<h3>I/O 统计信息<a class="headerlink" href="#i-o" title="Permalink to this headline">¶</a></h3>
<p>用 <a class="reference external" href="https://en.wikipedia.org/wiki/Iostat">iostat</a> 定位 I/O 相关问题。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">iostat</span> <span class="o">-</span><span class="n">x</span>
</pre></div>
</div>
</div>
<div class="section" id="id5">
<h3>诊断消息<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h3>
<p>要查看内核里的诊断信息，配合 <code class="docutils literal notranslate"><span class="pre">less</span></code> 、 <code class="docutils literal notranslate"><span class="pre">more</span></code> 、 <code class="docutils literal notranslate"><span class="pre">grep</span></code> 或
<code class="docutils literal notranslate"><span class="pre">tail</span></code> 使用 <code class="docutils literal notranslate"><span class="pre">dmesg</span></code> ，例如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">dmesg</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">scsi</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="id6">
<h2>停止自动重均衡<a class="headerlink" href="#id6" title="Permalink to this headline">¶</a></h2>
<p>你得周期性地维护集群的子系统、或解决某个失败域的问题（如一机架）。
如果你不想在停机维护 OSD 时让 CRUSH 自动重均衡，提前设置 <code class="docutils literal notranslate"><span class="pre">noout</span></code> ：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span> <span class="n">noout</span>
</pre></div>
</div>
<p>在 Luminous 或更新的版本上，可以只在受影响的 OSD 上设置此标记，这样更安全。
你可以分别设置：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="n">add</span><span class="o">-</span><span class="n">noout</span> <span class="n">osd</span><span class="mf">.0</span>
<span class="n">ceph</span> <span class="n">osd</span> <span class="n">rm</span><span class="o">-</span><span class="n">noout</span>  <span class="n">osd</span><span class="mf">.0</span>
</pre></div>
</div>
<p>或者一次设置整个 CRUSH 桶。比如说，你准备关闭 <code class="docutils literal notranslate"><span class="pre">prod-ceph-data1701</span></code> 来扩容内存：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span><span class="o">-</span><span class="n">group</span> <span class="n">noout</span> <span class="n">prod</span><span class="o">-</span><span class="n">ceph</span><span class="o">-</span><span class="n">data1701</span>
</pre></div>
</div>
<p>在集群上设置 <code class="docutils literal notranslate"><span class="pre">noout</span></code> 后，你就可以停机维护失败域内的 OSD
以及其它相关的 Ceph 服务了。:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">systemctl</span> <span class="n">stop</span> <span class="n">ceph</span>\<span class="o">*.</span><span class="n">service</span> <span class="n">ceph</span>\<span class="o">*.</span><span class="n">target</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>在定位同一故障域内的问题时，停机 OSD 内的归置组状态会变为 <code class="docutils literal notranslate"><span class="pre">degraded</span></code> 。</p>
</div>
<p>维护结束后，重启 OSD 和其它守护进程们。如果维护期间重启过主机，
无需干预它们应该就会自己回归。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sudo</span> <span class="n">systemctl</span> <span class="n">start</span> <span class="n">ceph</span><span class="o">.</span><span class="n">target</span>
</pre></div>
</div>
<p>最后，必须解除集群范围的 <code class="docutils literal notranslate"><span class="pre">noout</span></code> 标志。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="n">unset</span> <span class="n">noout</span>
<span class="n">ceph</span> <span class="n">osd</span> <span class="n">unset</span><span class="o">-</span><span class="n">group</span> <span class="n">noout</span> <span class="n">prod</span><span class="o">-</span><span class="n">ceph</span><span class="o">-</span><span class="n">data1701</span>
</pre></div>
</div>
<p>注意一下， Ceph 支持的大多数 Linux 发行版现在都在用 <code class="docutils literal notranslate"><span class="pre">systemd</span></code> 管理服务。
对于其它的或者比较老的操作系统，
你可能得用等价的 <code class="docutils literal notranslate"><span class="pre">service</span></code> 或 <code class="docutils literal notranslate"><span class="pre">start</span></code>/<code class="docutils literal notranslate"><span class="pre">stop</span></code> 命令。</p>
</div>
<div class="section" id="osd-not-running">
<span id="id7"></span><h2>OSD 没运行<a class="headerlink" href="#osd-not-running" title="Permalink to this headline">¶</a></h2>
<p>通常情况下，简单地重启 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 进程就可以重回集群并恢复。</p>
<div class="section" id="id8">
<h3>OSD 起不来<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h3>
<p>如果你启动集群时，其中一个 OSD 起不来，依次检查：</p>
<ul>
<li><p><strong>配置文件：</strong> 如果你新装的 OSD 不能启动，检查下配置文件，
确保它合爻性（比如 <code class="docutils literal notranslate"><span class="pre">host</span></code> 而非 <code class="docutils literal notranslate"><span class="pre">hostname</span></code> ，等等）；</p></li>
<li><p><strong>检查路径：</strong> 检查你配置的路径，
和它们自己实际的数据和元数据（日志、WAL、DB）。
如果你分离了 OSD 数据和元数据、而配置文件和实际挂载点存在出入，
启动 OSD 时就可能遇到麻烦。
如果你想把元数据存储在一个独立的块设备上，
应该通过驱动器分区或 LVM 为各 OSD 分别分配一个分区。</p></li>
<li><p><strong>检查最大线程数：</strong> 如果你的节点有很多 OSD ，
也许就会触碰到默认的最大线程数限制（如通常是 32k 个），
尤其是在恢复期间。你可以用 <code class="docutils literal notranslate"><span class="pre">sysctl</span></code> 增大线程数，
把最大线程数更改为支持的最大值（即 4194303 ），
看看是否有用。例如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">kernel</span><span class="o">.</span><span class="n">pid_max</span><span class="o">=</span><span class="mi">4194303</span>
</pre></div>
</div>
<p>如果增大最大线程数解决了这个问题，你可以把此配置
<code class="docutils literal notranslate"><span class="pre">kernel.pid_max</span></code> 写入 <code class="docutils literal notranslate"><span class="pre">/etc/sysctl.d</span></code> 内的文件或写入主配置 <code class="docutils literal notranslate"><span class="pre">/etc/sysctl.conf</span></code> ，使之永久生效，例如：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">kernel</span><span class="o">.</span><span class="n">pid_max</span> <span class="o">=</span> <span class="mi">4194303</span>
</pre></div>
</div>
</li>
<li><p><strong>检查 ``nf_conntrack``:</strong> 这个连接跟踪和限制系统
是许多 Ceph 生产集群的祸根，而且可能是潜在威胁，
因为起初一切都很好。随着集群的拓扑结构和客户端的载荷增长，
神秘的和间歇性的连接失败和性能问题就表现出来了，
随着时间的推移和在一天中的某些时间会更糟。
检查 <code class="docutils literal notranslate"><span class="pre">syslog</span></code> 历史记录，看是否有表填满事件。
你可以用 <code class="docutils literal notranslate"><span class="pre">sysctl</span></code> 命令把 <code class="docutils literal notranslate"><span class="pre">nf_conntrack_max</span></code> 提高到远高于当前的值来缓解此问题。
请确保将 <code class="docutils literal notranslate"><span class="pre">nf_conntrack_buckets</span></code> 相应地提高到
<code class="docutils literal notranslate"><span class="pre">nf_conntrack_max</span> <span class="pre">/</span> <span class="pre">4</span></code> ，这可能需要在 <code class="docutils literal notranslate"><span class="pre">sysctl</span></code> 之外操作，
例如 <code class="docutils literal notranslate"><span class="pre">&quot;echo</span> <span class="pre">131072</span> <span class="pre">&gt;</span> <span class="pre">/sys/module/nf_conntrack/parameters/hashsize</span></code> 。
更深入而细致的是把相关的内核模块列入黑名单来完全禁止它运行。
这是很脆弱的，因为这些模块因内核版本不同可能差别很大，
它们的罗列顺序可能也不同。即使被列入黑名单，
在有些情况下， <code class="docutils literal notranslate"><span class="pre">iptables</span></code> 或 <code class="docutils literal notranslate"><span class="pre">docker</span></code> 仍然会激活连接跟踪，
所以建议对这种调整采用 “设置后不管” 策略。
在现代系统中，这不会消耗太多资源。</p></li>
<li><p><strong>内核版本：</strong> 确认你在用的内核版本以及所用的发布版。
Ceph 默认依赖一些第三方工具，这些工具可能有缺陷或者与特定发布版和/或内核版本冲突（如 Google <code class="docutils literal notranslate"><span class="pre">gperftools</span></code> 和 <code class="docutils literal notranslate"><span class="pre">TCMalloc</span></code> ）。
检查下<a class="reference external" href="../../../start/os-recommendations">操作系统推荐</a>和各 Ceph 版本的发布说明，
以确保你已经解决了内核相关的问题。</p></li>
<li><p><strong>段错误：</strong> 如果出现了段错误，提高日志级别并再次启动有问题的守护进程。
如果段错误重现了，搜索一下 Ceph 缺陷追踪器
<a class="reference external" href="https://tracker.ceph.com/projects/ceph/">https://tracker.ceph/com/projects/ceph</a> 和
<code class="docutils literal notranslate"><span class="pre">dev</span></code> 、 <code class="docutils literal notranslate"><span class="pre">ceph-users</span></code> 邮件列表归档
<a class="reference external" href="https://ceph.io/resources">https://ceph.io/resources</a> 。
如果它真是一个新的、唯一的失败案例，把它发到 <code class="docutils literal notranslate"><span class="pre">dev</span></code> 邮件列表，
并提供运行着的 Ceph 版本号、 <code class="docutils literal notranslate"><span class="pre">ceph.conf</span></code> （把私密信息抹掉）、
你的监视器状态输出和日志文件的节选。</p></li>
</ul>
</div>
<div class="section" id="id9">
<h3>OSD 失败<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h3>
<p>某个 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 死掉时，活着的 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 守护进程们会报告给各监视器，
说它挂了，随后它就会浮现在 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">health</span></code> 命令的新状态信息里：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">health</span>
<span class="n">HEALTH_WARN</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span> <span class="ow">in</span> <span class="n">osds</span> <span class="n">are</span> <span class="n">down</span>
</pre></div>
</div>
<p>具体来说，只要有 OSD 被标记为 <code class="docutils literal notranslate"><span class="pre">in</span></code> 和 <code class="docutils literal notranslate"><span class="pre">down</span></code> ，你就会收到警告信息，
你可以用下面的命令得知具体哪个是 <code class="docutils literal notranslate"><span class="pre">down</span></code> 的：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">health</span> <span class="n">detail</span>
<span class="n">HEALTH_WARN</span> <span class="mi">1</span><span class="o">/</span><span class="mi">3</span> <span class="ow">in</span> <span class="n">osds</span> <span class="n">are</span> <span class="n">down</span>
<span class="n">osd</span><span class="mf">.0</span> <span class="ow">is</span> <span class="n">down</span> <span class="n">since</span> <span class="n">epoch</span> <span class="mi">23</span><span class="p">,</span> <span class="n">last</span> <span class="n">address</span> <span class="mf">192.168.106.220</span><span class="p">:</span><span class="mi">6800</span><span class="o">/</span><span class="mi">11080</span>
</pre></div>
</div>
<p>或</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="n">tree</span> <span class="n">down</span>
</pre></div>
</div>
<p>如果有个驱动器失败或其它错误使 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 不能正常运行或重启，
一条错误信息将会出现在 <code class="docutils literal notranslate"><span class="pre">/var/log/ceph/</span></code> 内的日志文件里。</p>
<p>如果守护进程因心跳失败、 <code class="docutils literal notranslate"><span class="pre">suicide</span> <span class="pre">timeout</span></code> 、
底层驱动器或文件系统无响应而停止，
查看一下 <code class="docutils literal notranslate"><span class="pre">dmesg</span></code> 和 <cite>syslog</cite> 输出获取驱动器或者其它的内核错误。
你可能得用诸如 <code class="docutils literal notranslate"><span class="pre">dmesg</span> <span class="pre">-T</span></code> 这样的命令加上时间戳，
否则很容易把旧消息误读成新的。</p>
<p>如果此问题是软件错误（失败的断言或其它意外错误），
搜索一下前述归档和追踪器，
如果没发现修正或已有的缺陷，
请把它反馈到 <a class="reference external" href="mailto:ceph-devel&#37;&#52;&#48;vger&#46;kernel&#46;org">ceph-devel</a> 邮件列表。</p>
</div>
<div class="section" id="no-free-drive-space">
<span id="id10"></span><h3>硬盘没剩余空间<a class="headerlink" href="#no-free-drive-space" title="Permalink to this headline">¶</a></h3>
<p>Ceph 不允许你向满的 OSD 写入数据，以免丢失数据。
在运营着的集群中， OSD 们和存储池接近 full ratio 时你应该会收到警告。
<code class="docutils literal notranslate"><span class="pre">mon</span> <span class="pre">osd</span> <span class="pre">full</span> <span class="pre">ratio</span></code> 默认为 <code class="docutils literal notranslate"><span class="pre">0.95</span></code> 、
或达到容量的 95% 时它将阻止客户端写入数据；
<code class="docutils literal notranslate"><span class="pre">mon</span> <span class="pre">osd</span> <span class="pre">backfillfull</span> <span class="pre">ratio</span></code> 默认为 <code class="docutils literal notranslate"><span class="pre">0.90</span></code> 、
或达到容量的 90% 以上时不会启动回填。
OSD 将满比率默认为 <code class="docutils literal notranslate"><span class="pre">0.85</span></code> 、
也就是说达到容量的 85% 时它会产生健康警告。</p>
<p>注意，集群内的单个 OSD 分配到的数据可能差别很大，
每个 OSD 的利用率可以用这个命令显示</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="n">df</span>
</pre></div>
</div>
<p>集群、存储池的总体利用率可以用这个命令检查</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">df</span>
</pre></div>
</div>
<p>特别留意一下那些 <strong>最满</strong> 的 OSD 们，可不是 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">df</span></code> 报告的原始空间使用率哦。
只要有一个突兀的 OSD 被填满，就会导致它所在存储池的写入失败。
<code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">df</span></code> 报告每个存储池的可用空间时涵盖了指定存储池里相对 <em>最满</em> OSD 的比例设置。
可以通过逐步地使用 <code class="docutils literal notranslate"><span class="pre">reweight-by-utilization</span></code> 命令将数据从过满的 OSD 移到未满的 OSD 上，从而使数据分布更加均匀。
对于用 Luminous 之后版本的人，
也可以试试 <code class="docutils literal notranslate"><span class="pre">ceph-mgar</span></code> <code class="docutils literal notranslate"><span class="pre">balancer</span></code>
模块来自动地、更高效地执行这个任务。</p>
<p>这些比率可以调整：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span><span class="o">-</span><span class="n">nearfull</span><span class="o">-</span><span class="n">ratio</span> <span class="o">&lt;</span><span class="nb">float</span><span class="p">[</span><span class="mf">0.0</span><span class="o">-</span><span class="mf">1.0</span><span class="p">]</span><span class="o">&gt;</span>
<span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span><span class="o">-</span><span class="n">full</span><span class="o">-</span><span class="n">ratio</span> <span class="o">&lt;</span><span class="nb">float</span><span class="p">[</span><span class="mf">0.0</span><span class="o">-</span><span class="mf">1.0</span><span class="p">]</span><span class="o">&gt;</span>
<span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span><span class="o">-</span><span class="n">backfillfull</span><span class="o">-</span><span class="n">ratio</span> <span class="o">&lt;</span><span class="nb">float</span><span class="p">[</span><span class="mf">0.0</span><span class="o">-</span><span class="mf">1.0</span><span class="p">]</span><span class="o">&gt;</span>
</pre></div>
</div>
<p>集群用满的问题一般出现在某个 OSD 失败时，
起因是在小型的和/或非常满或失衡的集群上进行的测试之类的原因。
当某一 OSD 或节点存储着很大部分的集群数据时，
因组件失败甚或自然增长就能诱发 <code class="docutils literal notranslate"><span class="pre">nearfull</span></code> 和 <code class="docutils literal notranslate"><span class="pre">full</span></code> 比率超额。
如果你在小型集群上测试 Ceph 如何应对 OSD 失败，
应该保留足够的空闲空间，
并且临时降低 OSD 的 <code class="docutils literal notranslate"><span class="pre">full</span> <span class="pre">ratio</span></code> 、 <code class="docutils literal notranslate"><span class="pre">backfillfull</span> <span class="pre">ratio</span></code> 和
<code class="docutils literal notranslate"><span class="pre">nearfull</span> <span class="pre">ratio</span></code> 值，命令为：</p>
<p><code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">health</span></code> 会显示将满的 <code class="docutils literal notranslate"><span class="pre">ceph-osds</span></code> ：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">health</span>
<span class="n">HEALTH_WARN</span> <span class="mi">1</span> <span class="n">nearfull</span> <span class="n">osd</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
</pre></div>
</div>
<p>或者：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">health</span> <span class="n">detail</span>
<span class="n">HEALTH_ERR</span> <span class="mi">1</span> <span class="n">full</span> <span class="n">osd</span><span class="p">(</span><span class="n">s</span><span class="p">);</span> <span class="mi">1</span> <span class="n">backfillfull</span> <span class="n">osd</span><span class="p">(</span><span class="n">s</span><span class="p">);</span> <span class="mi">1</span> <span class="n">nearfull</span> <span class="n">osd</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">osd</span><span class="mf">.3</span> <span class="ow">is</span> <span class="n">full</span> <span class="n">at</span> <span class="mi">97</span><span class="o">%</span>
<span class="n">osd</span><span class="mf">.4</span> <span class="ow">is</span> <span class="n">backfill</span> <span class="n">full</span> <span class="n">at</span> <span class="mi">91</span><span class="o">%</span>
<span class="n">osd</span><span class="mf">.2</span> <span class="ow">is</span> <span class="n">near</span> <span class="n">full</span> <span class="n">at</span> <span class="mi">87</span><span class="o">%</span>
</pre></div>
</div>
<p>处理集群用满的最好方法就是增加新 OSD 扩容，
这样集群就能把数据重分布到新存储器里。</p>
<p>如果因满载而导致旧的 FileStore OSD 不能启动，
你可以试着删除那个 OSD 上的一些归置组数据目录。</p>
<div class="admonition important">
<p class="admonition-title">Important</p>
<p>如果你准备从填满的 OSD 中删除某个归置组，
注意<strong>不要</strong>删除另一个 OSD 上的同名归置组，
否则<strong>你会丢数据</strong>。<strong>必须</strong>在多个 OSD 上保留至少一份数据副本。
这是一种少见的极端干涉方法，轻易不要用。</p>
</div>
<p>详情见<a class="reference external" href="../../configuration/mon-config-ref">监视器配置参考</a>。</p>
</div>
</div>
<div class="section" id="id11">
<h2>OSD 龟速或无响应<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h2>
<p>一个常见的问题是 OSD 龟速或无响应。在深入性能问题前，你应该先确保排除了其他故障的可能性。例如，确保你的网络运行正常、且 OSD 在运行，还要检查 OSD 是否被恢复流量拖住了。</p>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>较新版本的 Ceph 能更好地处理恢复，可防止恢复进程耗尽系统资源而导致 <code class="docutils literal notranslate"><span class="pre">up</span></code> 且 <code class="docutils literal notranslate"><span class="pre">in</span></code> 的 OSD 不可用或响应慢。</p>
</div>
<div class="section" id="id12">
<h3>网络问题<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h3>
<p>Ceph 是一个分布式存储系统，所以它靠网络实现
OSD 互联、复制、故障恢复、和心律传递。
网络问题会导致 OSD 延时和状态抖动，
详情参见<a class="reference internal" href="#id24">状态抖动的 OSD</a> 。</p>
<p>确保 Ceph 进程和 Ceph 依赖的进程连接了、和/或在监听。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">netstat</span> <span class="o">-</span><span class="n">a</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">ceph</span>
<span class="n">netstat</span> <span class="o">-</span><span class="n">l</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">ceph</span>
<span class="n">sudo</span> <span class="n">netstat</span> <span class="o">-</span><span class="n">p</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">ceph</span>
</pre></div>
</div>
<p>检查网络统计信息。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">netstat</span> <span class="o">-</span><span class="n">s</span>
</pre></div>
</div>
</div>
<div class="section" id="id13">
<h3>驱动器配置<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h3>
<p>一个 SAS 或 SATA 存储驱动器应该只用于一个 OSD ；
NVMe 驱动器可以轻松处理两个或更多。如果有其它进程
（包括日志/元数据、操作系统、 Ceph 监视器、 <cite>syslog</cite> 日志、
其它 OSD 以及非 Ceph 进程）共享驱动器，读和写吞吐量会成为瓶颈。</p>
<p>Ceph 在日志记录<em>完成之后</em>才会确认写操作，
所以高速 SSD 有助于降低响应时间，
尤其是在用旧的 FileStore OSD 搭配 <code class="docutils literal notranslate"><span class="pre">XFS</span></code> 或 <code class="docutils literal notranslate"><span class="pre">ext4</span></code> 文件系统时。
相反， <code class="docutils literal notranslate"><span class="pre">Btrfs</span></code> 文件系统可以同时写入和记日志。
（然而还是得注意，我们不建议在生产环境下用 <code class="docutils literal notranslate"><span class="pre">Btrfs</span></code> 。）</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>给驱动器分区并不能改变总吞吐量或顺序读写限制。把日志分离到单独的分区可能有所帮助，但最好是另外一个物理驱动器。</p>
</div>
</div>
<div class="section" id="id14">
<h3>坏扇区和碎片化硬盘<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h3>
<p>检修下硬盘是否有坏块、碎片、和其它会导致性能急剧下降的错误。有用的工具有 <code class="docutils literal notranslate"><span class="pre">dmesg</span></code> 、 <code class="docutils literal notranslate"><span class="pre">syslog</span></code> 日志、和 <code class="docutils literal notranslate"><span class="pre">smartctl</span></code>
（包含在 <code class="docutils literal notranslate"><span class="pre">smartmontools</span></code> 软件包里）。</p>
</div>
<div class="section" id="id15">
<h3>监视器和 OSD 蜗居<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h3>
<p>监视器是相对轻量的进程，但它们会发出大量 <code class="docutils literal notranslate"><span class="pre">fsync()</span></code> 系统调用，这会妨碍其它工作负载，特别是监视器和 OSD 共享驱动器时。另外，如果你在 OSD 主机上同时运行监视器，遭遇的性能问题可能和这些相关：</p>
<ul class="simple">
<li><p>运行较老的内核（低于3.0）</p></li>
<li><p>运行的内核不支持 <code class="docutils literal notranslate"><span class="pre">syncfs(2)</span></code> 系统调用</p></li>
</ul>
<p>在这些情况下，同一主机上运行着的多个 OSD 会发出大量提交，导致相互拖累。这种情况经常会导致爆发写。</p>
</div>
<div class="section" id="id16">
<h3>进程蜗居<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h3>
<p>与 OSD 们共存于同一套硬件、并向 Ceph 写入数据的进程（融合），
像基于云的解决方案、虚拟机和其他应用程序们，
会导致 OSD 延时大增。一般来说，
我们建议用一些主机跑 Ceph 、用另外一些主机跑其它进程。
实践证明把 Ceph 和其他应用程序分开可提高性能、并简化故障排除和运维。</p>
</div>
<div class="section" id="id17">
<h3>日志记录级别<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h3>
<p>如果你为追踪某问题提高过日志级别、但结束后忘了调回去，这个 OSD
将向硬盘写入大量日志。如果你想始终保持高日志级别，可以考虑给默认日志路径挂载个硬盘，即 <code class="docutils literal notranslate"><span class="pre">/var/log/ceph/$cluster-$name.log</span></code> 。</p>
</div>
<div class="section" id="id18">
<h3>恢复节流<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h3>
<p>根据你的配置， Ceph 可以降低恢复速度来维持性能，
否则它会不顾 OSD 性能而加快恢复速度。检查下 OSD 是否正在恢复。</p>
</div>
<div class="section" id="id19">
<h3>内核版本<a class="headerlink" href="#id19" title="Permalink to this headline">¶</a></h3>
<p>检查下你在用的内核版本。较老的内核也许没有移植能提高 Ceph 性能的功能。</p>
</div>
<div class="section" id="syncfs">
<h3>内核与 SyncFS 问题<a class="headerlink" href="#syncfs" title="Permalink to this headline">¶</a></h3>
<p>试试在一主机上只运行一个 OSD ，看看能否提升性能。老内核未必支持有 <code class="docutils literal notranslate"><span class="pre">syncfs(2)</span></code> 系统调用的 <code class="docutils literal notranslate"><span class="pre">glibc</span></code> 。</p>
</div>
<div class="section" id="id20">
<h3>文件系统问题<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h3>
<p>当前，我们建议用 BlueStore 后端部署集群。
运行 Luminous 之前的版本、或由于某些原因还得用之前的 FileStore 后端部署 OSD 时，我们推荐 <code class="docutils literal notranslate"><span class="pre">XFS</span></code> 。</p>
<p>我们不推荐用 <code class="docutils literal notranslate"><span class="pre">Btrfs</span></code> 或 <code class="docutils literal notranslate"><span class="pre">ext4</span></code> 。 <code class="docutils literal notranslate"><span class="pre">Btrfs</span></code> 有很多诱人的功能，
但文件系统自身的缺陷可能导致性能问题，以及 ENOSPC 伪错误。
我们不建议使用 <code class="docutils literal notranslate"><span class="pre">ext4</span></code> 做 OSD 的 FileStore ，因为其 <code class="docutils literal notranslate"><span class="pre">xattr</span></code> 尺寸限制会破坏我们对长对象名的支持，而这是 RGW 必需的。</p>
<p>详情见<a class="reference external" href="../configuration/filesystem-recommendations">文件系统推荐</a>。</p>
</div>
<div class="section" id="id22">
<h3>内存不足<a class="headerlink" href="#id22" title="Permalink to this headline">¶</a></h3>
<p>我们建议给每个 OSD 守护进程 <em>最少</em> 4GB 内存，而且建议在 6-8GB 之上取整。
你也许注意到了，日常操作中 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 进程仅会用其中一小部分。
你也许想用这些空闲内存同时跑一些其他应用、或者克扣各节点的内存容量。然而当 OSD 在恢复时，其内存使用会激增，
如果内存不够充足， OSD 的性能将明显降低，
而且守护进程们甚至会崩溃或被 Linux 的 <code class="docutils literal notranslate"><span class="pre">OOM</span> <span class="pre">Killer</span></code> 杀死。</p>
</div>
<div class="section" id="blocked-requests-slow-requests">
<h3>blocked requests 或 slow requests<a class="headerlink" href="#blocked-requests-slow-requests" title="Permalink to this headline">¶</a></h3>
<p>如果某 <code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 守护进程对一请求响应很慢，它会记录日志消息，
说出耗时过于长的那些操作。默认警告阀值是 30 秒，用 <code class="docutils literal notranslate"><span class="pre">osd</span> <span class="pre">op</span> <span class="pre">complaint</span> <span class="pre">time</span></code> 选项来配置。
这种情况发生时，集群日志系统会收到消息。</p>
<p>老旧版本抱怨 <code class="docutils literal notranslate"><span class="pre">old</span> <span class="pre">requests</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">osd</span><span class="mf">.0</span> <span class="mf">192.168.106.220</span><span class="p">:</span><span class="mi">6800</span><span class="o">/</span><span class="mi">18813</span> <span class="mi">312</span> <span class="p">:</span> <span class="p">[</span><span class="n">WRN</span><span class="p">]</span> <span class="n">old</span> <span class="n">request</span> <span class="n">osd_op</span><span class="p">(</span><span class="n">client</span><span class="mf">.5099.0</span><span class="p">:</span><span class="mi">790</span> <span class="n">fatty_26485_object789</span> <span class="p">[</span><span class="n">write</span> <span class="mi">0</span><span class="o">~</span><span class="mi">4096</span><span class="p">]</span> <span class="mf">2.5e54</span><span class="n">f643</span><span class="p">)</span> <span class="n">v4</span> <span class="n">received</span> <span class="n">at</span> <span class="mi">2012</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">06</span> <span class="mi">15</span><span class="p">:</span><span class="mi">42</span><span class="p">:</span><span class="mf">56.054801</span> <span class="n">currently</span> <span class="n">waiting</span> <span class="k">for</span> <span class="n">sub</span> <span class="n">ops</span>
</pre></div>
</div>
<p>较新版本的 Ceph 抱怨 <code class="docutils literal notranslate"><span class="pre">slow</span> <span class="pre">requests</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">{</span><span class="n">date</span><span class="p">}</span> <span class="p">{</span><span class="n">osd</span><span class="o">.</span><span class="n">num</span><span class="p">}</span> <span class="p">[</span><span class="n">WRN</span><span class="p">]</span> <span class="mi">1</span> <span class="n">slow</span> <span class="n">requests</span><span class="p">,</span> <span class="mi">1</span> <span class="n">included</span> <span class="n">below</span><span class="p">;</span> <span class="n">oldest</span> <span class="n">blocked</span> <span class="k">for</span> <span class="o">&gt;</span> <span class="mf">30.005692</span> <span class="n">secs</span>
<span class="p">{</span><span class="n">date</span><span class="p">}</span> <span class="p">{</span><span class="n">osd</span><span class="o">.</span><span class="n">num</span><span class="p">}</span>  <span class="p">[</span><span class="n">WRN</span><span class="p">]</span> <span class="n">slow</span> <span class="n">request</span> <span class="mf">30.005692</span> <span class="n">seconds</span> <span class="n">old</span><span class="p">,</span> <span class="n">received</span> <span class="n">at</span> <span class="p">{</span><span class="n">date</span><span class="o">-</span><span class="n">time</span><span class="p">}:</span> <span class="n">osd_op</span><span class="p">(</span><span class="n">client</span><span class="mf">.4240.0</span><span class="p">:</span><span class="mi">8</span> <span class="n">benchmark_data_ceph</span><span class="o">-</span><span class="mi">1_39426</span><span class="n">_object7</span> <span class="p">[</span><span class="n">write</span> <span class="mi">0</span><span class="o">~</span><span class="mi">4194304</span><span class="p">]</span> <span class="mf">0.69848840</span><span class="p">)</span> <span class="n">v4</span> <span class="n">currently</span> <span class="n">waiting</span> <span class="k">for</span> <span class="n">subops</span> <span class="kn">from</span> <span class="p">[</span><span class="mi">610</span><span class="p">]</span>
</pre></div>
</div>
<p>可能的起因有：</p>
<ul class="simple">
<li><p>快要坏的驱动器（查验一下 <code class="docutils literal notranslate"><span class="pre">dmesg</span></code> 输出）；</p></li>
<li><p>内核文件系统缺陷（查验一下 <code class="docutils literal notranslate"><span class="pre">dmesg</span></code> 输出）；</p></li>
<li><p>集群过载（检查系统负载、 iostat 等等）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">ceph-osd</span></code> 守护进程缺陷。</p></li>
</ul>
<p>可能的解决方法：</p>
<ul class="simple">
<li><p>从 Ceph 主机去除 VM ；</p></li>
<li><p>升级内核；</p></li>
<li><p>升级 Ceph ；</p></li>
<li><p>重启 OSD 。</p></li>
<li><p>替换坏的或快要坏的组件；</p></li>
</ul>
</div>
<div class="section" id="id23">
<h3>慢请求的调试<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h3>
<p>运行 <code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">daemon</span> <span class="pre">osd.&lt;id&gt;</span> <span class="pre">dump_historic_ops</span></code> 或
<code class="docutils literal notranslate"><span class="pre">ceph</span> <span class="pre">daemon</span> <span class="pre">osd.&lt;id&gt;</span> <span class="pre">dump_ops_in_flight</span></code> 命令时，
你会看到一堆操作和各个操作过程的一个事件列表，下面简单说明一下。</p>
<p>信使层事件：</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">header_read</span></code>: 信使从离线开始首次读取消息；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">throttled</span></code>: 信使尝试申请内存节流空间，用于读入消息时；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">all_read</span></code>: 信使已离线、并读完了消息；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">dispatched</span></code>: 信使把消息发给 OSD 时；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">initiated</span></code>: 等价于 <code class="docutils literal notranslate"><span class="pre">header_read</span></code> ，这二者都保留着是历史遗留问题。</p></li>
</ul>
<p>OSD 处理 ops 时的事件：</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">queued_for_pg</span></code>: op 已放入队列，等着它自己的 PG 来处理；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">reached_pg</span></code>: 其 PG 已开始处理这个 op ；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">waiting</span> <span class="pre">for</span> <span class="pre">\*</span></code>: 此 op 正等着某些其它工作结束，这样它才能继续下一步（如，一个新 OSDMap ；等着这个对象目标完成洗刷；
等着相应的 PG 完成互联；所有都在消息内指出了）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">started</span></code>: 此 op 已被这个 OSD 接受为应该做的事，
并且正在进行中；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">waiting</span> <span class="pre">for</span> <span class="pre">subops</span> <span class="pre">from</span></code>: 此 op 已发送给了副本 OSD 们。</p></li>
</ul>
<p><code class="docutils literal notranslate"><span class="pre">`FileStore`</span></code> 事件:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">commit_queued_for_journal_write</span></code>: 此 op 已递送给了 FileStore 。</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">write_thread_in_journal_buffer</span></code>: 此 op 已经在日志的缓冲中了、并等着持久化（等着下一次硬盘写操作）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">journaled_completion_queued</span></code>: 此 op 已在硬盘上作了日志、且它的回调已进入队列等着被调用了。</p></li>
</ul>
<p>数据已传递给更底层存储之后的 OSD 事件：</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">op_commit</span></code>: 此 op 已被主 OSD 提交（即已写入日志）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">op_applied</span></code>: 此 op <a class="reference external" href="https://www.freebsd.org/cgi/man.cgi?write(2)">已写入 write()</a>
主 OSD 的后端文件系统（即在内存里已应用，但还没刷入硬盘）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">sub_op_applied</span></code>: （类似前面的） <code class="docutils literal notranslate"><span class="pre">op_applied</span></code> ，只是这次是发生在副本上的 subop （子操作）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">sub_op_committed</span></code>: 就是 <code class="docutils literal notranslate"><span class="pre">op_commit</span></code> ，可这次是发生在副本上的 subop （仅发生在 EC 存储池中）；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">sub_op_commit_rec/sub_op_apply_rec</span> <span class="pre">from</span> <span class="pre">&lt;X&gt;</span></code>: 主 OSD 得知上述消息后会做这些标记，只是为某个特定副本（即 <code class="docutils literal notranslate"><span class="pre">&lt;X&gt;</span></code> ）做标记；</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">commit_sent</span></code>: 我们已经把回信发给客户端（或主 OSD ，来自子操作的）了。</p></li>
</ul>
<p>这些事件里，有很多看起来显得多余，但都是代码里的穿越重要边界的（像数据加锁后传入新线程）。</p>
</div>
</div>
<div class="section" id="id24">
<h2>状态抖动的 OSD<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h2>
<p>OSD 们互联和检查心跳时会优先选集群网（后端），详情见<a class="reference external" href="../../configuration/mon-osd-interaction">监视器与 OSD 的交互</a>。</p>
<p>传统上，我们建议拆分 <em>公共</em> (前端）和 <em>私密</em> （集群、后端、复制）的网络：</p>
<ol class="arabic simple">
<li><p>隔离心跳、复制、恢复流量（私网）与客户端、 OSD &lt;-&gt; mon 流量（公网）。
这样有助于防范另一边发生的 DoS 攻击，但同样也可能发生连锁失效。</p></li>
<li><p>公网和私网流量都会有额外吞吐量。</p></li>
</ol>
<p>常用的网络速率是 100Mb/s 和 1Gb/s 时，这种隔离通常是必要的。
当今用上了 10Gb/s 、 40Gb/s 和 25/50/100Gb/s 的网络，
前面对于容量的关注一般就减少甚至不存在了。
比如，你的 OSD 节点都有 2 个网口，
一个接公网、另一个接私网就意味着没有线路冗余。
这样降低了你在不影响集群和客户端的前提下、
容忍网络维护和失效的能力。试想一下，如果两条链路都用于公网：
采用端口绑定（ LACP ）或等价路由（如 FRR ），
你可以从增加的吞吐量空间、容错性、和减少的 OSD 抖动中获益。</p>
<p>当私网（或者仅仅是主机的一条链路）失败、或降级，同时，公网却正常运行， OSD 就不能很好地处理这种情况。这时的情形就是，
OSD 们会用公网相互向监视器报告邻居 <code class="docutils literal notranslate"><span class="pre">down</span></code> 了、同时把它自己标记为 <code class="docutils literal notranslate"><span class="pre">up</span></code> 的。然后监视器们就再次向公网散播更新过的集群运行图，把受影响的 OSD 们标记成了 <cite>down</cite> ，这些 OSD 们又向监视器反馈“我还没死呢！”，如此循环往复。我们把这种情形称为状态抖动（或打摆子， flapping ），而且它很难隔离和矫正。如果没有私网，就避免了这种讨厌的动态：
OSD 们通常要么是 <code class="docutils literal notranslate"><span class="pre">up</span></code> 要么是 <code class="docutils literal notranslate"><span class="pre">down</span></code> ，没有抖动。</p>
<p>如果有东西导致 OSD 状态抖动（反复地被标记为 <code class="docutils literal notranslate"><span class="pre">down</span></code> ，然后又 <code class="docutils literal notranslate"><span class="pre">up</span></code> ），你可以临时冻结它们的状态，强制监视器们暂停打摆子：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span> <span class="n">noup</span>      <span class="c1"># prevent OSDs from getting marked up</span>
<span class="n">ceph</span> <span class="n">osd</span> <span class="nb">set</span> <span class="n">nodown</span>    <span class="c1"># prevent OSDs from getting marked down</span>
</pre></div>
</div>
<p>这些标记记录在 osdmap 里:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="n">dump</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">flags</span>
<span class="n">flags</span> <span class="n">no</span><span class="o">-</span><span class="n">up</span><span class="p">,</span><span class="n">no</span><span class="o">-</span><span class="n">down</span>
</pre></div>
</div>
<p>下列命令可清除标记：</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">ceph</span> <span class="n">osd</span> <span class="n">unset</span> <span class="n">noup</span>
<span class="n">ceph</span> <span class="n">osd</span> <span class="n">unset</span> <span class="n">nodown</span>
</pre></div>
</div>
<p>还支持其它两个标记 <code class="docutils literal notranslate"><span class="pre">noin</span></code> 和 <code class="docutils literal notranslate"><span class="pre">noout</span></code> ，
它们分别可防止正在启动的 OSD 被标记为 <code class="docutils literal notranslate"><span class="pre">in</span></code> （已分配数据）、
或防止 OSD 被误标记为 <code class="docutils literal notranslate"><span class="pre">out</span></code>
（不管 <code class="docutils literal notranslate"><span class="pre">mon</span> <span class="pre">osd</span> <span class="pre">down</span> <span class="pre">out</span> <span class="pre">interval</span></code> 当前的值是什么）。</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p><code class="docutils literal notranslate"><span class="pre">noup</span></code> 、 <code class="docutils literal notranslate"><span class="pre">noout</span></code> 和 <code class="docutils literal notranslate"><span class="pre">nodown</span></code> 从某种意义上说是临时的，
一旦标记清除了，它们被阻塞的动作短时间内就会发生；相反， <code class="docutils literal notranslate"><span class="pre">noin</span></code> 标记是阻止 OSD 启动后进入集群，
但其它所有设置标记前就已经启动了的守护进程们都维持原样。</p>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>打摆子的起因和影响有时候可以通过仔细地调整
<code class="docutils literal notranslate"><span class="pre">mon_osd_down_out_subtree_limit</span></code> 、
<code class="docutils literal notranslate"><span class="pre">mon_osd_reporter_subtree_level</span></code> 、和
<code class="docutils literal notranslate"><span class="pre">mon_osd_min_down_reporters</span></code> 来消除。
最优配置的偏离取决于集群大小、拓扑结构、和在用的 Ceph 版本。
它们之间的相互影响很微妙，超出了本文档的范围。</p>
</div>
</div>
</div>



           </div>
           
          </div>
          <footer>
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
        <a href="../troubleshooting-pg/" class="btn btn-neutral float-right" title="归置组排障" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
        <a href="../troubleshooting-mon/" class="btn btn-neutral float-left" title="监视器故障排除" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>
        &#169; Copyright 2016, Ceph authors and contributors. Licensed under Creative Commons Attribution Share Alike 3.0 (CC-BY-SA-3.0).

    </p>
  </div> 

</footer>
        </div>
      </div>

    </section>

  </div>
  

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>

  
  
    
   

</body>
</html>